%{
	#include <stdio.h>
	#include "synt.h"
	extern int ligne;
	int chr = 0;
	int debug1 = 0;
	void yyerror(const char * msg);
	void verb(char * string);
%}

%option noyywrap
/* DEFINITIONS REGULIERES */

/* caracteres */
lettre 				[a-zA-Z]
chiffre				[0-9]

/* mots ...  */

/*mot reserve du langage*/
new					"new"
free 				"free"
function			"function"
procedure			"procedure"
program				"program"|"PROGRAM"
begin				"BEGIN"|"begin"
end 				"END"|"end"
is 					"is"|"IS"
return				"return"|"RETURN"

/*variable*/
type				"integer"|"float"
boolean 			"true"|"false"
identifiant			{lettre}+({chiffre}|{lettre})*
entier				{chiffre}+
decimal				{chiffre}+(\.{chiffre}+)?

/* parentheses */
parentheseOuvr 		\(
parentheseFerm  	\)
crochetOuvr			\[
crochetFerm			\]

/* operations et comparaisons*/
opAffectation		":="
opPlus				"+"
opMoins				"-"
opDiv				"/"
opMult				"*"

/* operation booleenes */
non					"!"
et					"&&"
ou					"||"

/* comparaisons */
cmpInf 				"<"
cmpSup				">"
cmpInfegal			"<="
cmpSupegal			">="
cmpEgal 			"="
cmpDiff				"<>"

/* terminaisons et separateur */
deuxpoint 			:
virgule				,
finInstruction 		;
endOfLine			\n

/* REGLES DE TRADUCTION */
%%

[[:blank:]]+		{ chr += yyleng; }

if 					{
						//yylval.stringT = strdup(yytext);						
						if (debug1) verb("IF");
						chr += yyleng;
						return (IF);
					}

then 				{
						//yylval.stringT = strdup(yytext);						
						if (debug1) verb("THEN");
						chr += yyleng;
						return (THEN);
					}

else        		{
						//yylval.stringT = strdup(yytext);	
						if (debug1) verb("ELSE");				
						chr += yyleng;
						return (ELSE);
					}

while				{
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("WHILE");
						chr += yyleng;
						return (WHILE);	
					}

do					{
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("DO");
						chr += yyleng;
						return (DO);	
					}

{new}				{
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("new");
						chr += yyleng;
						return (NEW);	
					}
{free} 				{
						yylval.stringT = strdup(yytext);
						if (debug1) verb("free");
						chr += yyleng;
						return (FREE);	
					}
{function}			{
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("function");
						chr += yyleng;
						return (FUNCTION);	
					}
{procedure}			{
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("procedure");
						chr += yyleng;
						return (PROCEDURE);	
					}
{program}			{
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("PROGRAM");
						chr += yyleng;
						return (PROGRAM);	
					}	
{begin}				{
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("begin");
						chr += yyleng;
						return (_BEGIN);	
					}
{end}				{
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("END");
						chr += yyleng;
						return (END);	
					}
{is}				{
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("is");
						chr += yyleng;
						return (IS);	
					}
{return}			{
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("return");
						chr += yyleng;
						return (RETURN);	
					}
{type}				{ 
						yylval.stringT = strdup(yytext);
						if (debug1) verb("TYPE");
						chr += yyleng;	
						return(TYPE); 
					}

{boolean}			{ 
						yylval.stringT = strdup(yytext);
						if (debug1) verb("BOOLEAN");
						chr += yyleng;	
						return(BOOLEAN); 
					}

{identifiant}		{ 
						yylval.stringT = strdup(yytext);	
						if (debug1) verb("IDENTIFIANT");
						chr += yyleng;	
						return(IDENTIFIANT); 
					}

{entier}			{ 
						yylval.stringT = strdup(yytext);
						if (debug1) verb("ENTIER");
						chr += yyleng;	
						return(ENTIER); 
					}

{decimal}			{ 
						yylval.stringT = strdup(yytext);
						if (debug1) verb("DECIMAL");
						chr += yyleng;	
						return(DECIMAL); 
					}						

{deuxpoint}			{
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("DEUXPOINT");
						chr += yyleng;
						return (DEUXPOINT);	
					}
{virgule}			{
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("VIRGULE");
						chr += yyleng;
						return (VIRGULE);	
					}


{parentheseOuvr}	{ 
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("PARENTHESEOUVRANTE");
						chr += yyleng;	
						return(PARENTHESEOUVRANTE); 
					}

{parentheseFerm}	{ 
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("PARENTHESEFERMANTE");
						chr += yyleng;	
						return(PARENTHESEFERMANTE);
					}

{crochetOuvr}		{
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("CROCHETOUVRANT");
						chr += yyleng;	
						return(CROCHETOUVRANT);					
					}										

{crochetFerm}		{ 
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("CROCHETFERMANT");
						chr += yyleng;	
						return(CROCHETFERMANT); 
					}

{opPlus}			{ 
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("PLUS");
						chr += yyleng;	
						return(PLUS); 
					}

{opMoins}			{ 
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("MOINS");
						chr += yyleng;	
						return(MOINS); 
					}

{opDiv}				{ 
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("DIV");
						chr += yyleng;	
						return(DIV); 
					}

{opMult}			{ 
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("MULT");
						chr += yyleng;	
						return(MULT); 
					}

{non}				{ 
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("NON");
						chr += yyleng;	
						return(NON); 
					}

{et}				{ 
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("ET");
						chr += yyleng;	
						return(ET); 
					}

{ou}				{ 
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("OU");
						chr += yyleng;	
						return(OU); 
					}

{cmpInf}			{ 
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("INF");
						chr += yyleng;	
						return(INF); 
					}

{cmpInfegal}			{ 
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("INFEGAL");
						chr += yyleng;	
						return(INFEGAL); 
					}

{cmpSup}			{ 
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("SUP");
						chr += yyleng;	
						return(SUP); 
					}

{cmpSupegal}		{ 
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("SUPEGAL");
						chr += yyleng;	
						return(SUPEGAL); 
					}

{cmpEgal}			{ 
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("EGAL");
						chr += yyleng;	
						return(EGAL); 
					}

{cmpDiff}			{ 
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("DIFF");
						chr += yyleng;	
						return(DIFF); 
					}
	
{opAffectation}		{
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("OPAFFECTATION");
						chr += yyleng;	
						return (OPAFFECTATION);			
					}							

{finInstruction}	{ 
						//yylval.stringT = strdup(yytext);
						if (debug1) verb("FININSTRUCTION");
						chr += yyleng;	
						return(FININSTRUCTION); 
					} // pour remplir table des symboles ou arbre ... (Yytext, FININSTRUCTION)									

{endOfLine}			{ 
						if (debug1) verb("_________end_of_line________");
						ligne++; chr = 0;						
					}

<<EOF>>				{ 
						printf("[Fichier lexicalement analysé]\n"); 
						return 0; 
					}

.					{ 
						char msg[100]; 
						sprintf(msg,"Erreur lexicale à la ligne %d au caractère %d (caractère %c du mot %s)\n", ligne, chr, yytext[0],yytext); 
						yyerror(msg); 
						return 1; 
					}
%%

void verb(char * string){
	printf("Lexème reconnu pour le token %s : ",string);
	ECHO;
	printf("\n");
}
